﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include "IPositionAssociatedPlane.h"

namespace gcmp
{
    class IDocument;
    class UniIdentity;

    /// \brief 带二个偏移量的单个平面定位类
    class GCMP_MODEL_INTERFACE_EXPORT IPositionSingleAssociatedPlaneWithTwoOffsets : public IPositionAssociatedPlane
    {
        DEFINE_CAST_DERIVED(gcmp::IPositionSingleAssociatedPlaneWithTwoOffsets, gcmp::IPositionAssociatedPlane)
    public:
      /// \brief 创建带两个偏移量的底部关联平面定位对象
      /// \param pElement 元素指针
      /// \param associatedPlaneId 关联平面id 
      /// \param startOffset 起始偏移量
      /// \param endOffset  终始偏移量
      /// \return 两个偏移量的底部关联平面定位对象
      static OwnerPtr<IPositionSingleAssociatedPlaneWithTwoOffsets> CreateBottomSingleAssociatedPlaneWithTwoOffsets(IElement *pElement, const ElementId &associatedPlaneId, double startOffset, double endOffset);
     
      /// \brief 创建带两个偏移量的顶部关联平面定位对象
      /// \param pElement 元素指针
      /// \param associatedPlaneId 关联平面id 
      /// \param startOffset 起始偏移量
      /// \param endOffset  终始偏移量
      /// \return 两个偏移量的顶部关联平面定位对象
      static OwnerPtr<IPositionSingleAssociatedPlaneWithTwoOffsets> CreateTopSingleAssociatedPlaneWithTwoOffsets(IElement *pElement, const ElementId &associatedPlaneId, double startOffset, double endOffset);
    
    public:
        /// \brief 得到关联平面id
        /// \return 关联平面id
        virtual ElementId GetAssociatedPlaneId() const = 0;

        /// \brief 设置关联平面id
        /// \param id  关联平面id
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetAssociatedPlaneId(const ElementId &id) = 0;

        /// \brief 得到关联平面坐标系
        /// \return 关联平面坐标系
        virtual Coordinate3d GetAssociatedPlaneCoordinate3d() const = 0;

        /// \brief 得到关联平面参数GUID
        /// \return 关联平面参数GUID
        virtual UniIdentity GetAssociatedPlaneParameterUid() const = 0;

        /// \brief 设置关联平面参数GUID
        /// \param planeParameterUid 关联平面参数GUID
        /// \return 返回true表示成功设置，否则表示失败  
        virtual bool SetAssociatedPlaneParameterUid(const UniIdentity& planeParameterUid) = 0;

        /// \brief 得到起始偏移参数GUID
        /// \return 起始偏移参数GUID
        virtual UniIdentity GetStartOffsetParameterUid() const = 0;

        /// \brief 设置起始偏移参数GUID
        /// \param parameterUid 起始偏移参数GUID
        /// \return 返回true表示成功设置，否则表示失败  
        virtual bool SetStartOffsetParameterUid(const UniIdentity& parameterUid) = 0;

        /// \brief 得到终止偏移参数GUID
        /// \return 终止偏移参数GUID
        virtual UniIdentity GetEndOffsetParameterUid() const = 0;

        /// \brief 设置终止偏移参数GUID
        /// \param parameterUid 终止偏移参数GUID
        /// \return 返回true表示成功设置，否则表示失败  
        virtual bool SetEndOffsetParameterUid(const UniIdentity& parameterUid) = 0;

        /// \brief 得到起始偏移量
        /// \return 起始偏移量
        virtual double GetStartOffset() const = 0;

        /// \brief 设置起始偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetStartOffset(double value) = 0;

        /// \brief 得到终止偏移量
        /// \return 终止偏移量
        virtual double GetEndOffset() const = 0;

        /// \brief 设置终止偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetEndOffset(double value) = 0;
         
        /// \brief 判断是否保持水平定位
        /// 
        /// 判断标准:起始偏移量等于终始偏移量是为保持水平定位（返回true）
        /// \return 返回true表示保持水平定位，否则表示不是 
        virtual bool IsStayHorizontal() const = 0;

        /// \brief 得到关联平面偏移参数GUID
        /// \return 关联平面偏移参数GUID
        virtual UniIdentity GetAssociatedPlaneOffsetParameterUid() const = 0;

        /// \brief 设置关联平面偏移参数GUID
        /// \param planeOffsetParameterUid 关联平面偏移参数GUID
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetAssociatedPlaneOffsetParameterUid(const UniIdentity& planeOffsetParameterUid) = 0;

        /// \brief 返回是否允许关联平面整体偏移
        /// \return true表示允许，false表示不允许
        virtual bool IsAllowAssociatedPlaneOffsetParameter() const = 0;

        /// \brief 设置是否允许关联平面整体偏移
        /// \param value true表示允许，false表示不允许
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetIsAllowAssociatedPlaneOffsetParameter(bool value) = 0;
    };
}


